package net.hands.common.ado;

import java.io.Serializable;
import java.util.Date;

import net.hands.common.Convert;
import net.hands.common.ObjectUtils;

/**
 * 说明:数据过滤项
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public class FilterItem implements Serializable {
	/**
	 * 条件
	 */
	private EFilterRelation relation;
	/**
	 * 字段
	 */
	private String column;
	
   /**
    * 查询值 和旧值
    */
	private Object value,oldValue;
   /**
    * 逻辑枚举
    */
	private EFilterOpe ope;
	
	/**
	 * 默认字段等于值
	* Constructor Method  
	* @update 2012-12-5 下午11:24:21  
	* @param column 字段
	* @param value 值
	* 
	 */
	public FilterItem(final String column, final Object value) {
		this(column, EFilterRelation.equal, value);
	}

   /**
    * 无字段
   * Constructor Method  
   * @update 2012-9-19 下午6:17:46  
   * @param relation 条件枚举
   * @param value 值
    */
	public FilterItem(final EFilterRelation relation, final Object value) {
		this(null,relation, value);
	}
   /**
    * 
   * Constructor Method  
   * @update 2012-9-19 下午6:17:50  
   * @param relation 条件枚举
   * @param value 值
   * @param ope and or 逻辑枚举
    */
	public FilterItem(final String column,final EFilterRelation relation, final Object value) {
		this.column = column;
		this.relation = relation;
		this.value = value;
	}
   /**
   * 说明:获得条件
   * @return EFilterRelation
   * @update 2012-9-19 下午6:17:59
    */
	public EFilterRelation getRelation() {
		return relation == null ? EFilterRelation.equal : relation;
	}
   /**
   * 说明:设置条件 
   * @param relation 条件枚举
   * @update 2012-9-19 下午6:18:28
    */
	public FilterItem setRelation(final EFilterRelation relation) {
		this.relation = relation;
		return this;
	}
	/**
	 * 
	* 说明：获得字段
	* @return FilterItem
	* @update 2012-12-5 下午11:30:50
	 */
	public String getColumn() {
		return column;
	}
   /**
    * 
   * 说明：设置字段
   * @param column
   * @return FilterItem
   * @update 2012-12-5 下午11:31:01
    */
	public FilterItem setColumn(final String column) {
		this.column = column;
		return this;
	}
	
  /**
  * 说明:获得值 
  * @return Object
  * @update 2012-9-19 下午6:19:37
   */
	public Object getValue() {
		return value;
	}
   /**
   * 说明:设置值 
   * @param value 值
   * @return FilterItem
   * @update 2012-9-19 下午6:19:53
    */
	public FilterItem setValue(final Object value) {
		this.value = value;
		return this;
	}
   /**
   * 说明:获得逻辑
   * @return EFilterOpe
   * @update 2012-9-19 下午6:20:02
    */
	public EFilterOpe getOpe() {
		return ope == null ? EFilterOpe.and : ope;
	}
   /**
    * 说明:设置逻辑 
   * @param ope and or 逻辑枚举
   * @return FilterItem
   * @update 2012-9-19 下午6:20:27
    */
	public FilterItem setOpe(final EFilterOpe ope) {
		this.ope = ope;
		return this;
	}
   /**
   * 说明:获得旧值 
   * @return String
   * @update 2012-9-19 下午6:20:39
    */
	public Object getOldValue() {
		return oldValue;
	}
   /**
   * 说明:设置目标值 
   * @param ovalue
   * @return FilterItem
   * @update 2012-9-19 下午6:21:06
    */
	public FilterItem setOldValue(final String ovalue) {
		this.oldValue = ovalue;
		return this;
	}
   /**
   * 说明:是否删除
   * @param v 字段值
   * @param propertyType 值类型
   * @return boolean
   * @update 2012-9-19 下午6:21:21
    */
	public boolean isDelete(final Object v, final Class<?> propertyType) {
		//条件
		final EFilterRelation r = getRelation();
		//获得值
		final Object v2 = getValue();//查询值
		
		if (r == EFilterRelation.equal && ObjectUtils.objectEquals(v, v2)) {//条件是等于 并且v与v2相等
			return false;
		} else if (r == EFilterRelation.not_equal && !ObjectUtils.objectEquals(v, v2)) {//条件是不等于 并且v于v2不相等
			return false;
		} else if (r == EFilterRelation.like && v != null && v2 != null
				&& Convert.toString(v).contains(Convert.toString(v2))) {//条件是like 并且 v字符包含v2字符
			return false;
		} else if (Number.class.isAssignableFrom(propertyType)) {//属性类型为数字
			final double d = Convert.toDouble(v, Double.MIN_VALUE);//v对象转双精度
			final double d2 = Convert.toDouble(v2, Double.MIN_VALUE);//v2对象转双精度
			/*
			 * 条件大于并v大于v2或
			 * 条件大于等于并v大于等于v2或
			 * 条件小于并v小于v2或
			 * 条件小于等于v小于等于v2
			 */
			if ((r == EFilterRelation.gt && d > d2) || (r == EFilterRelation.gt_equal && d >= d2)
					|| (r == EFilterRelation.lt && d < d2) || (r == EFilterRelation.lt_equal && d <= d2)) {
				 
				return false;
			}
		} else if (Date.class.isAssignableFrom(propertyType)) {//属性是否是日期类
			final Date d = (Date) v;
			final Date d2 = (Date) v2;
			if (d != null && d2 != null) {
				/*条件是大于并d大于d2或
				 * 条件是大于等于并d大于等于d2或
				 * 条件是小于等于并d小于d2或
				 * 条件是小于等于并d小于d2
				 */
				if ((r == EFilterRelation.gt && d.after(d2))
						|| (r == EFilterRelation.gt_equal && (d.after(d2) || d.equals(d2)))
						|| (r == EFilterRelation.lt && d.before(d2))
						|| (r == EFilterRelation.lt_equal && (d.before(d2) || d.equals(d2)))) {
					return false;
				}
			}
		}
		return true;
	}

	private static final long serialVersionUID = 598446923126901786L;
}
